// import { _decorator, Prefab, Node, SpriteComponent, SpriteFrame, ImageAsset, resources, error, Texture2D, instantiate, isValid, find, TextAsset, JsonAsset, assetManager } from "cc";
// const { ccclass } = _decorator;

// @ccclass("ResourceUtil")
// export class ResourceUtil {
//     /**
//  * 加载资源
//  * @param url   资源路径
//  * @param type  资源类型
//  * @param cb    回调
//  * @method loadRes
//  */
//     public static loadRes(url: string, type: any, cb: Function = () => { }) {
//         resources.load(url, (err: any, res: any) => {
//             if (err) {
//                 error(err.message || err);
//                 cb(err, res);
//                 return;
//             }

//             cb && cb(null, res);
//         })
//     }


//     /**
//      * 加载资源
//      * @param url   资源路径
//      * @param type  资源类型
//      * @method loadRes
//      */
//     public static loadResType(url: string, type: any) {
//         return new Promise<any>((resolve, reject) => {
//             resources.load(url, type, (err: any, res: any) => {
//                 if (err) {
//                     error(err.message || err);
//                     reject && reject(err)
//                     return;
//                 }

//                 resolve && resolve(res);
//             })
//         })
//     }

//     /**
//      * 获取特效prefab
//      * @param modulePath 路径
//      * @returns 
//      */
//     public static loadEffectRes(modulePath: string) {
//         return new Promise((resolve, reject) => {
//             this.loadRes(`prefab/effect/${modulePath}`, Prefab, (err: any, prefab: Prefab) => {
//                 if (err) {
//                     console.error('effect load failed', modulePath);
//                     reject && reject();
//                     return;
//                 }

//                 resolve && resolve(prefab);
//             })
//         })
//     }

//     /**
//      * 获取模型数据
//      * @param modulePath 模型路径
//      * @returns 
//      */
//     public static loadModelRes(modulePath: string) {
//         return new Promise((resolve, reject) => {
//             this.loadRes(`prefab/model/${modulePath}`, Prefab, (err: any, prefab: Prefab) => {
//                 if (err) {
//                     console.error("model load failed", modulePath);
//                     reject && reject();
//                     return;
//                 }

//                 resolve && resolve(prefab);
//             })
//         })
//     }

//     /**
//      * 获取多模型数据
//      * @param path 资源路径
//      * @param arrName 资源名称
//      * @param progressCb 过程回调函数
//      * @param completeCb 完成回调函数
//      */
//     public static loadModelResArr(path: string, arrName: Array<string>, progressCb: any, completeCb: any) {
//         let arrUrls = arrName.map((item) => {
//             return `${path}/${item}`;
//         })

//         resources.load(arrUrls, Prefab, progressCb, completeCb);
//     }

//     /**
//      * 获取贴图资源
//      * @param path 贴图路径
//      * @returns 
//      */
//     public static loadSpriteFrameRes(path: string) {
//         return new Promise((resolve, reject) => {
//             this.loadRes(path, SpriteFrame, (err: any, img: ImageAsset) => {
//                 if (err) {
//                     console.error('spriteFrame load failed!', path, err);
//                     reject && reject();
//                     return;
//                 }

//                 let texture = new Texture2D();
//                 texture.image = img;

//                 let sf = new SpriteFrame();
//                 sf.texture = texture;

//                 resolve && resolve(sf);
//             })
//         })
//     }

//     /**
//  * 获取贴图资源
//  * @param path 贴图路径
//  * @returns 
//  */
//     public static loadSpriteFrameURL(url: string, sprite: SpriteComponent) {
//         assetManager.loadRemote(url, (err: any, img: ImageAsset) => {
//             if (err) {
//                 console.error('spriteFrame load failed!', url, err);
//                 return;
//             }

//             let texture = new Texture2D();
//             texture.image = img;

//             let sf = new SpriteFrame();
//             sf.texture = texture;
//             sprite.spriteFrame = sf;
//         })
//     }

//     /**
//      * 获取关卡数据
//      * @param level 关卡
//      * @param cb 回调函数
//      */
//     public static getMap(level: number, cb: Function) {
//         let levelStr: string = 'map';
//         //前面补0
//         if (level >= 100) {
//             levelStr += level;
//         } else if (level >= 10) {
//             levelStr += '0' + level;
//         } else {
//             levelStr += '00' + level;
//         }

//         this.loadRes(`map/config/${levelStr}`, null, (err: {}, txtAsset: any) => {
//             if (err) {
//                 cb(err, txtAsset);
//                 return;
//             }

//             let content: string = '';
//             if (txtAsset._file) {
//                 //@ts-ignore
//                 if (window['LZString']) {
//                     //@ts-ignore
//                     content = window['LZString'].decompressFromEncodedURIComponent(txtAsset._file);
//                 }
//                 var objJson = JSON.parse(content);
//                 cb(null, objJson);
//             } else if (txtAsset.text) {
//                 //@ts-ignore
//                 if (window['LZString']) {
//                     //@ts-ignore
//                     content = window['LZString'].decompressFromEncodedURIComponent(txtAsset.text);
//                 }
//                 var objJson = JSON.parse(content);
//                 cb(null, objJson);
//             } else if (txtAsset.json) {
//                 cb(null, txtAsset.json);
//             } else {
//                 cb('failed');
//             }
//         });
//     }

//     /**
//      * 获取关卡数据
//      * @param type 关卡类型
//      * @param arrName 资源名称
//      * @param progressCb 过程回调函数
//      * @param completeCb 完成回调函数
//      */
//     public static getMapObj(type: string, arrName: Array<string>, progressCb?: any, completeCb?: any) {
//         let arrUrls: string[] = [];
//         for (let idx = 0; idx < arrName.length; idx++) {
//             arrUrls.push(`map/${type}/${arrName[idx]}`)
//         }

//         resources.load(arrUrls, Prefab, progressCb, completeCb);
//     }

//     /**
//      * 获取UI prefab
//      * @param prefabPath prefab路径 
//      * @param cb 回调函数
//      */
//     public static getUIPrefabRes(prefabPath: string, cb?: Function) {
//         this.loadRes("prefab/ui/" + prefabPath, Prefab, cb);
//     }

//     /**
//      * 创建ui界面
//      * @param path ui路径
//      * @param cb 回调函数
//      * @param parent 父节点
//      */
//     public static createUI(path: string, cb?: Function, isTip?: boolean) {
//         this.getUIPrefabRes(path, function (err: {}, prefab: Prefab) {
//             if (err) return;
//             let node: Node = instantiate(prefab);
//             node.setPosition(0, 0, 0);
//             var parent: Node = null;
//             if (isTip) {
//                 parent = find("Canvas/ui/tip") as Node;
//             } else {
//                 parent = find("Canvas/ui/dislog") as Node;
//             }

//             parent.addChild(node);
//             cb && cb(null, node);
//         });
//     }

//     /**
//      * 获取json数据
//      * @param fileName 文件名
//      * @param cb 回调函数 
//      */
//     public static getJsonData(fileName: string, cb: Function) {
//         this.loadRes("datas/" + fileName, null, function (err: any, content: JsonAsset) {
//             if (err) {
//                 error(err.message || err);
//                 return;
//             }
//             console.log("datas/" + fileName);
//             console.log(content.toString());
//             if (content.json) {
//                 cb(err, content.json);
//             } else {
//                 cb('failed!!!');
//             }
//         });
//     }

//     /**
//      * 获取文本数据
//      * @param fileName 文件名
//      * @param cb  回调函数
//      */
//     public static getTextData(fileName: string, cb: Function) {
//         this.loadRes("datas/" + fileName, null, function (err: any, content: TextAsset) {
//             if (err) {
//                 error(err.message || err);
//                 return;
//             }

//             let text: string = content.text;
//             cb(err, text);
//         });
//     }

//     /**
//      * 设置精灵贴图
//      * @param path 资源路径
//      * @param sprite 精灵
//      * @param cb 回调函数
//      */
//     public static setSpriteFrame(path: string, sprite: SpriteComponent, cb: Function) {
//         this.loadRes(path + '/spriteFrame', SpriteFrame, (err: any, spriteFrame: SpriteFrame) => {
//             if (err) {
//                 console.error('set sprite frame failed! err:', path, err);
//                 cb(err);
//                 return;
//             }

//             if (sprite && isValid(sprite)) {
//                 sprite.spriteFrame = spriteFrame;
//                 cb(null);
//             }
//         });
//     }

//     public static getEffectPrefab(effectName: string, cb: Function) {
//         this.loadRes(`prefab/effect/${effectName}/${effectName}`, Prefab, cb);
//     }

//     /**
//      * 资源路径释放
//     */
//     public static releaseRes(path: string, type?: any) {
//         resources.release(path);
//         console.log("release res:" + path);
//     }

//     public static loadResSprite(path: string, type: typeof SpriteFrame = SpriteFrame) {
//         return new Promise<SpriteFrame>((resolve, reject) => {
//           resources.load<SpriteFrame>(path, type, (err, res) => {
//             if (err) {
//               reject(err)
//               return
//             }
//             resolve(res)
//           })
//         })
//       }
    
//       public static loadDirSprite(path: string, type: typeof SpriteFrame = SpriteFrame) {
//         return new Promise<SpriteFrame[]>((resolve, reject) => {
//           resources.loadDir<SpriteFrame>(path, type, (err, res) => {
//             if (err) {
//               reject(err)
//               return
//             }
//             resolve(res)
//           })
//         })
//       }

// }
